--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_fuzzing_extended.py v4.6.0-rc.2 (7bbe9846) Text, 18.11 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787os
Tff7b72import T7ee787random
Tff7b72from T7ee787contextlib Tff7b72import Te6edf3ExitStack
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787pytest
Tff7b72import T7ee787RNS
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3HealthCheckTb4b4b4, Te6edf3givenTb4b4b4, Te6edf3settings
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3strategies Tff7b72as Te6edf3st
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8fftemp_dirTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_appTb4b4b4(Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Te6edf3real_identity_class Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentity
Tff7b72class T56d364MockIdentityClassTb4b4b4(Te6edf3real_identity_classTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6fftest_hash_32_bytes_long_01234567Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffhexhash Tff7b72= Tff7b72selfTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3ExitStackTb4b4b4(Tb4b4b4) Tff7b72as Te6edf3stackTb4b4b4:
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.DatabaseTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.ConfigManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.MessageHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.AnnounceManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.ArchiverManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.MapManagerTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.TelephoneManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.VoicemailManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.RingtoneManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.RNCPHandlerTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.RNStatusHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.RNProbeHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.TranslatorHandlerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.identity_context.CommunityInterfacesManagerTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.AsyncUtilsTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffLXMF.LXMRouterTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffLXST.Primitives.TelephonyTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.IdentityTa5d6ff"Tb4b4b4, Te6edf3MockIdentityClassTb4b4b4)Tb4b4b4)
Te6edf3mock_reticulum_class Tff7b72= Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.ReticulumTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3mock_reticulum_classTff7b72.Td2a8ffMTU Tff7b72= T79c0ff1200
Te6edf3mock_reticulum_classTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffMTU Tff7b72= T79c0ff1200
Te6edf3mock_transport_class Tff7b72= Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.TransportTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3mock_transport_classTff7b72.Td2a8ffMTU Tff7b72= T79c0ff1200
Te6edf3mock_transport_classTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffMTU Tff7b72= T79c0ff1200
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffthreading.ThreadTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3ReticulumMeshChatTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_loopTa5d6ff"Tb4b4b4,
Te6edf3newTff7b72=Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3ReticulumMeshChatTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_sync_propagation_nodesTa5d6ff"Tb4b4b4,
Te6edf3newTff7b72=Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3ReticulumMeshChatTb4b4b4,
Ta5d6ff"Ta5d6ffcrawler_loopTa5d6ff"Tb4b4b4,
Te6edf3newTff7b72=Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3ReticulumMeshChatTb4b4b4,
Ta5d6ff"Ta5d6ffauto_backup_loopTa5d6ff"Tb4b4b4,
Te6edf3newTff7b72=Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3mock_id Tff7b72= Te6edf3MockIdentityClassTb4b4b4(Tb4b4b4)
Te6edf3mock_idTff7b72.Td2a8ffget_private_key Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Ta5d6ffbTa5d6ff"Ta5d6fftest_private_keyTa5d6ff"Tb4b4b4)
Te6edf3stackTff7b72.Td2a8ffenter_contextTb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3MockIdentityClassTb4b4b4, Ta5d6ff"Ta5d6fffrom_fileTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3mock_idTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3app Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_idTb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffactive_downloads Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3appTff7b72.Td2a8ffdownload_id_counter Tff7b72= T79c0ff0
Te6edf3appTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
T8b949e# Setup basic config mocks
Te6edf3appTff7b72.Td2a8ffconfig Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3attr Tff7b72in Tb4b4b4[
Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflanguageTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_greetingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_default_latTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_default_lonTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4:
Tffa657getattrTb4b4b4(Te6edf3appTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3attrTb4b4b4)Tff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6fftestTa5d6ff"
Tff7b72for Te6edf3attr Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffauto_announce_enabledTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvoicemail_enabledTa5d6ff"Tb4b4b4]Tb4b4b4:
Tffa657getattrTb4b4b4(Te6edf3appTff7b72.Td2a8ffconfigTb4b4b4, Te6edf3attrTb4b4b4)Tff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Te6edf3appTff7b72.Td2a8ffconfigTff7b72.Td2a8fflxmf_inbound_stamp_costTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= T79c0ff8
Tff7b72return Te6edf3app
T8b949e# WebSocket API Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3dataTff7b72=Te6edf3stTff7b72.Td2a8ffrecursiveTb4b4b4(
Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(Te6edf3stTff7b72.Td2a8ffnoneTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffbooleansTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8fffloatsTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffintegersTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tff7b72lambda Te6edf3childrenTb4b4b4: Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(
Te6edf3stTff7b72.Td2a8fflistsTb4b4b4(Te6edf3childrenTb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8ffdictionariesTb4b4b4(Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3childrenTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_websocket_api_recursive_fuzzingTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz the websocket API with recursive random data structures."""
Te6edf3mock_client Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_clientTff7b72.Td2a8ffsend_str Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Tff7b72lambda Te6edf3dTb4b4b4: Tff7b72NoneTb4b4b4)
T8b949e# We must ensure "type" is present if it's a dict, or it might fail early
T8b949e# but that's also part of fuzzing - seeing if it crashes without "type".
Tff7b72tryTb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffon_websocket_data_receivedTb4b4b4(Te6edf3mock_clientTb4b4b4, Te6edf3dataTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149KeyErrorTb4b4b4, Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4, Tf85149AttributeErrorTb4b4b4)Tb4b4b4:
T8b949e# These are expected for malformed data
Tff7b72pass
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3pytestTff7b72.Td2a8fffailTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffWebSocket API crashed with recursive data: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3msg_typeTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3payloadTff7b72=Te6edf3stTff7b72.Td2a8ffdictionariesTb4b4b4(Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_websocket_api_type_fuzzingTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3msg_typeTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz the websocket API with random types and flat dictionary payloads."""
Te6edf3mock_client Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_clientTff7b72.Td2a8ffsend_str Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Tff7b72lambda Te6edf3dTb4b4b4: Tff7b72NoneTb4b4b4)
Te6edf3data Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3msg_typeTb4b4b4}
Te6edf3dataTff7b72.Td2a8ffupdateTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffon_websocket_data_receivedTb4b4b4(Te6edf3mock_clientTb4b4b4, Te6edf3dataTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149KeyErrorTb4b4b4, Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4, Tf85149AttributeErrorTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3pytestTff7b72.Td2a8fffailTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffWebSocket API crashed with type=Tffd700{Te6edf3msg_typeTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# URI Parsing Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3uriTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff2000Tb4b4b4)Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_lxm_uri_parsing_fuzzingTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3uriTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz LXM URI ingestion logic."""
Tff7b72tryTb4b4b4:
T8b949e# Assuming there's a method or logic that handles lxm:// URIs
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3mock_appTb4b4b4, Ta5d6ff"Ta5d6ffingest_lxm_uriTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffingest_lxm_uriTb4b4b4(Te6edf3uriTb4b4b4)
T8b949e# Also test it through the websocket interface if it exists there
Te6edf3mock_client Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffon_websocket_data_receivedTb4b4b4(
Te6edf3mock_clientTb4b4b4,
Tb4b4b4{Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflxm.ingest_uriTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffuriTa5d6ff"Tb4b4b4: Te6edf3uriTb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149KeyErrorTb4b4b4, Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4, Tf85149AttributeErrorTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
T8b949e# Some specific exceptions might be okay depending on implementation,
T8b949e# but generic crash is not.
Tff7b72if Ta5d6ff"Ta5d6ffhexTa5d6ff" Tff7b72not Tff7b72in Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4: T8b949e# Ignore hex decoding errors which are common
Te6edf3pytestTff7b72.Td2a8fffailTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffURI ingestion crashed with uri=Tffd700{Te6edf3uriTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# LXMF Packet/Message Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3contentTff7b72=Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff5000Tb4b4b4)Tb4b4b4,
Te6edf3titleTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff500Tb4b4b4)Tb4b4b4,
Te6edf3fieldsTff7b72=Te6edf3stTff7b72.Td2a8ffdictionariesTb4b4b4(Te6edf3stTff7b72.Td2a8ffintegersTb4b4b4(Te6edf3min_valueTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_valueTff7b72=T79c0ff255Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_lxmf_message_construction_fuzzingTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3titleTb4b4b4, Te6edf3fieldsTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz LXMF message construction and field handling."""
Tff7b72tryTb4b4b4:
T8b949e# Mock a destination
Te6edf3dest Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3destTff7b72.Td2a8ffhash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)
T8b949e# Test field assignment
Te6edf3lxmf_msg Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4(Te6edf3destTb4b4b4, Te6edf3mock_appTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3titleTff7b72=Te6edf3titleTb4b4b4)
Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3fieldsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3lxmf_msgTff7b72.Td2a8fffieldsTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3v
T8b949e# Test encoding/decoding if possible
Te6edf3lxmf_msgTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
T8b949e# LXMF.LXMessage.unpack(packed) # Might need more mocks
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
T8b949e# Database Migration/Data Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3table_nameTff7b72=Te6edf3stTff7b72.Td2a8ffsampled_fromTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffmessagesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffannouncesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffidentitiesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Te6edf3dataTff7b72=Te6edf3stTff7b72.Td2a8ffdictionariesTb4b4b4(
Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffintegersTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffnoneTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_database_record_fuzzingTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3table_nameTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz database record insertion logic (simulated)."""
Tff7b72tryTb4b4b4:
Te6edf3dao Tff7b72= Tff7b72None
Tff7b72if Te6edf3table_name Tff7b72== Ta5d6ff"Ta5d6ffmessagesTa5d6ff" Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3mock_appTff7b72.Td2a8ffdatabaseTb4b4b4, Ta5d6ff"Ta5d6ffmessagesTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3dao Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffmessages
Tff7b72elif Te6edf3table_name Tff7b72== Ta5d6ff"Ta5d6ffannouncesTa5d6ff" Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3mock_appTff7b72.Td2a8ffdatabaseTb4b4b4, Ta5d6ff"Ta5d6ffannouncesTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3dao Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffdatabaseTff7b72.Td2a8ffannounces
Tff7b72if Te6edf3dao Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3daoTb4b4b4, Ta5d6ff"Ta5d6ffupsertTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3daoTff7b72.Td2a8ffupsertTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
T8b949e# Config Update Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3config_updatesTff7b72=Te6edf3stTff7b72.Td2a8ffdictionariesTb4b4b4(
Te6edf3stTff7b72.Td2a8ffsampled_fromTb4b4b4(
Tb4b4b4[
Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffauto_announce_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflanguageTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_enabledTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicemail_greetingTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_default_latTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmap_default_lonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_inbound_stamp_costTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffintegersTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffbooleansTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffnoneTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_config_update_fuzzingTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3config_updatesTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz the update_config method with various types for known keys."""
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3mock_appTb4b4b4, Ta5d6ff"Ta5d6ffupdate_configTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffupdate_configTb4b4b4(Te6edf3config_updatesTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4, Tf85149AttributeErrorTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3pytestTff7b72.Td2a8fffailTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffConfig update crashed: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# LXMF Paper URI Generation Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3destination_hashTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3contentTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3titleTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_lxm_generate_paper_uri_fuzzingTb4b4b4(
Te6edf3mock_appTb4b4b4,
Te6edf3destination_hashTb4b4b4,
Te6edf3contentTb4b4b4,
Te6edf3titleTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""Fuzz lxm.generate_paper_uri WebSocket handler."""
Te6edf3mock_client Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_clientTff7b72.Td2a8ffsend_str Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Tff7b72lambda Te6edf3dTb4b4b4: Tff7b72NoneTb4b4b4)
Te6edf3data Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflxm.generate_paper_uriTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3destination_hashTb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Te6edf3contentTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Te6edf3titleTb4b4b4,
Tb4b4b4}
Tff7b72tryTb4b4b4:
Tff7b72await Te6edf3mock_appTff7b72.Td2a8ffon_websocket_data_receivedTb4b4b4(Te6edf3mock_clientTb4b4b4, Te6edf3dataTb4b4b4)
Tff7b72except Tb4b4b4(Tf85149KeyErrorTb4b4b4, Tf85149TypeErrorTb4b4b4, Tf85149ValueErrorTb4b4b4, Tf85149AttributeErrorTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
T8b949e# Ignore common hex decoding or identity not found errors
Tff7b72if Ta5d6ff"Ta5d6ffhexTa5d6ff" Tff7b72not Tff7b72in Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72and Ta5d6ff"Ta5d6ffidentity not foundTa5d6ff" Tff7b72not Tff7b72in Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8fffailTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPaper URI generation crashed: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# Telemetry Packet Fuzzing (More intensive)
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3dataTff7b72=Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff10000Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_telemetry_deep_fuzzingTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
T8b949e"""Deep fuzz the telemetry unpacking logic with large random payloads."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787telemetry_utils Tff7b72import Te6edf3Telemeter
Tff7b72tryTb4b4b4:
Te6edf3TelemeterTff7b72.Td2a8fffrom_packedTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
T8b949e# Markdown Renderer Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3textTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff10000Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_markdown_renderer_fuzzingTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz the markdown to HTML renderer."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787markdown_renderer Tff7b72import Te6edf3MarkdownRenderer
Tff7b72tryTb4b4b4:
Te6edf3html_out Tff7b72= Te6edf3MarkdownRendererTff7b72.Td2a8ffrenderTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3html_outTb4b4b4, Tffa657strTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3pytestTff7b72.Td2a8fffailTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffMarkdownRenderer crashed: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3textTff7b72=Te6edf3stTff7b72.Td2a8ffone_ofTb4b4b4(
Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff5000Tb4b4b4)Tb4b4b4,
Te6edf3stTff7b72.Td2a8ffsampled_fromTb4b4b4(
Tb4b4b4[
Ta5d6ff"Ta5d6ff<script>alert(1)</script>Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff[x](javascript:alert(1))Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff[x](data:text/html,<script>alert(1)</script>)Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff**Ta5d6ff" Tff7b72* T79c0ff2000Tb4b4b4,
Ta5d6ff"Ta5d6ff#Ta5d6ff" Tff7b72* T79c0ff2000Tb4b4b4,
Ta5d6ff"Ta5d6ff`Ta5d6ff" Tff7b72* T79c0ff2000Tb4b4b4,
Ta5d6ff"Ta5d6ff[](Ta5d6ff" Tff7b72* T79c0ff500 Tff7b72+ Ta5d6ff"Ta5d6ff)Ta5d6ff" Tff7b72* T79c0ff500Tb4b4b4,
Ta5d6ff"Tffea00\x00Tffea00\x01Tffea00\x02Tffea00\nTffea00\tTa5d6ff"Tb4b4b4,
Ta5d6ff"Tffea00\ufffdTa5d6ff" Tff7b72* T79c0ff100Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_markdown_renderer_dangerous_patternsTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz markdown renderer with known risky patterns (XSS, ReDoS, control chars)."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787markdown_renderer Tff7b72import Te6edf3MarkdownRenderer
Tff7b72tryTb4b4b4:
Te6edf3html_out Tff7b72= Te6edf3MarkdownRendererTff7b72.Td2a8ffrenderTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3html_outTb4b4b4, Tffa657strTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff<script>Ta5d6ff" Tff7b72not Tff7b72in Te6edf3html_out
Tff7b72assert Ta5d6ff"Ta5d6ffjavascript:Ta5d6ff" Tff7b72not Tff7b72in Te6edf3html_out
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3pytestTff7b72.Td2a8fffailTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffMarkdownRenderer crashed on dangerous pattern: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
T8b949e# LXMF Message Dictionary Conversion Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3contentTff7b72=Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff1000Tb4b4b4)Tb4b4b4,
Te6edf3titleTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff100Tb4b4b4)Tb4b4b4,
Te6edf3fields_dataTff7b72=Te6edf3stTff7b72.Td2a8ffdictionariesTb4b4b4(Te6edf3stTff7b72.Td2a8ffintegersTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff255Tb4b4b4)Tb4b4b4, Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_lxmf_to_dict_conversion_fuzzingTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3titleTb4b4b4, Te6edf3fields_dataTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz the LXMF message to dictionary conversion logic."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787lxmf_utils Tff7b72import Te6edf3convert_lxmf_message_to_dict
Tff7b72tryTb4b4b4:
T8b949e# Create a real-ish LXMessage but fuzzed
Te6edf3dest Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3destTff7b72.Td2a8ffhash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3msg Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4(Te6edf3destTb4b4b4, Te6edf3mock_appTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3titleTff7b72=Te6edf3titleTb4b4b4)
Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3fields_dataTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3msgTff7b72.Td2a8fffieldsTb4b4b4[Te6edf3kTb4b4b4] Tff7b72= Te6edf3v
T8b949e# Manually set some fields that might be expected
Te6edf3msgTff7b72.Td2a8ffhash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffsource_hash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffdestination_hash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffincoming Tff7b72= Te6edf3randomTff7b72.Td2a8ffchoiceTb4b4b4(Tb4b4b4[Tff7b72TrueTb4b4b4, Tff7b72FalseTb4b4b4]Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffprogress Tff7b72= Te6edf3randomTff7b72.Td2a8ffrandomTb4b4b4(Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffrssi Tff7b72= Te6edf3randomTff7b72.Td2a8ffrandintTb4b4b4(Tff7b72-T79c0ff120Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffsnr Tff7b72= Te6edf3randomTff7b72.Td2a8ffrandintTb4b4b4(Tff7b72-T79c0ff20Tb4b4b4, T79c0ff20Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffq Tff7b72= Te6edf3randomTff7b72.Td2a8ffrandintTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff100Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffdelivery_attempts Tff7b72= Te6edf3randomTff7b72.Td2a8ffrandintTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff10Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3convert_lxmf_message_to_dictTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657dictTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
T8b949e# LXMF might throw internal errors on weird fields, which is okay as long as it doesn't crash the whole app
Tff7b72pass
T8b949e# LXMF Delivery Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3contentTff7b72=Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff2000Tb4b4b4)Tb4b4b4,
Te6edf3titleTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff100Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_on_lxmf_delivery_fuzzingTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3titleTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz the LXMF delivery handler with various message contents."""
Tff7b72tryTb4b4b4:
Te6edf3dest Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3destTff7b72.Td2a8ffhash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3msg Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMessageTb4b4b4(Te6edf3destTb4b4b4, Te6edf3mock_appTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3contentTb4b4b4, Te6edf3titleTff7b72=Te6edf3titleTb4b4b4)
T8b949e# Add random fields
Te6edf3msgTff7b72.Td2a8fffieldsTb4b4b4[Te6edf3LXMFTff7b72.Td2a8ffFIELD_TELEMETRYTb4b4b4] Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(Te6edf3randomTff7b72.Td2a8ffrandintTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff100Tb4b4b4)Tb4b4b4)
T8b949e# These are usually set by LXMF when receiving
Te6edf3msgTff7b72.Td2a8ffsource_hash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffhash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff16Tb4b4b4)
Te6edf3msgTff7b72.Td2a8ffsignature Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff64Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffon_lxmf_deliveryTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
T8b949e# Announce Ingestion Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3aspectTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3destination_hashTff7b72=Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff64Tb4b4b4)Tb4b4b4,
Te6edf3app_dataTff7b72=Te6edf3stTff7b72.Td2a8ffbinaryTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff1000Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_on_lxmf_announce_received_fuzzingTb4b4b4(
Te6edf3mock_appTb4b4b4,
Te6edf3aspectTb4b4b4,
Te6edf3destination_hashTb4b4b4,
Te6edf3app_dataTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""Fuzz the announce received handler."""
Tff7b72tryTb4b4b4:
Te6edf3announced_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3announced_identityTff7b72.Td2a8ffhash Tff7b72= Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff32Tb4b4b4)
Te6edf3announced_identityTff7b72.Td2a8ffget_public_key Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Te6edf3osTff7b72.Td2a8ffurandomTb4b4b4(T79c0ff32Tb4b4b4)Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8ffon_lxmf_announce_receivedTb4b4b4(
Te6edf3aspectTb4b4b4,
Te6edf3destination_hashTb4b4b4,
Te6edf3announced_identityTb4b4b4,
Tff7b72NoneTb4b4b4, T8b949e# reticulum instance
Te6edf3app_dataTb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
T8b949e# Interface Config Parser Fuzzing (More intensive)
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3config_textTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff10000Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_interface_config_parser_deep_fuzzingTb4b4b4(Te6edf3config_textTb4b4b4)Tb4b4b4:
T8b949e"""Deep fuzz the interface configuration parser."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787interface_config_parser Tff7b72import Te6edf3InterfaceConfigParser
Tff7b72tryTb4b4b4:
Te6edf3InterfaceConfigParserTff7b72.Td2a8ffparseTb4b4b4(Te6edf3config_textTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
T8b949e# We don't care if it fails to parse, just that it doesn't crash the process
Tff7b72pass
T8b949e# Telemeter Roundtrip Fuzzing
Tf0883e@settingsTb4b4b4(Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3batteryTff7b72=Te6edf3stTff7b72.Td2a8fffloatsTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff100Tb4b4b4, Te6edf3allow_nanTff7b72=Tff7b72FalseTb4b4b4, Te6edf3allow_infinityTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Te6edf3uptimeTff7b72=Te6edf3stTff7b72.Td2a8ffintegersTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff2Tff7b72*Tff7b72*T79c0ff32 Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3loadTff7b72=Te6edf3stTff7b72.Td2a8fffloatsTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff100Tb4b4b4, Te6edf3allow_nanTff7b72=Tff7b72FalseTb4b4b4, Te6edf3allow_infinityTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Te6edf3temperatureTff7b72=Te6edf3stTff7b72.Td2a8fffloatsTb4b4b4(Tff7b72-T79c0ff50Tb4b4b4, T79c0ff100Tb4b4b4, Te6edf3allow_nanTff7b72=Tff7b72FalseTb4b4b4, Te6edf3allow_infinityTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_telemeter_roundtrip_fuzzingTb4b4b4(Te6edf3batteryTb4b4b4, Te6edf3uptimeTb4b4b4, Te6edf3loadTb4b4b4, Te6edf3temperatureTb4b4b4)Tb4b4b4:
T8b949e"""Fuzz telemeter packing and unpacking in a roundtrip."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787telemetry_utils Tff7b72import Te6edf3Telemeter
Tff7b72tryTb4b4b4:
Te6edf3t Tff7b72= Te6edf3TelemeterTb4b4b4(
Te6edf3batteryTff7b72=Te6edf3batteryTb4b4b4,
Te6edf3uptimeTff7b72=Te6edf3uptimeTb4b4b4,
Te6edf3loadTff7b72=Te6edf3loadTb4b4b4,
Te6edf3temperatureTff7b72=Te6edf3temperatureTb4b4b4,
Tb4b4b4)
Te6edf3packed Tff7b72= Te6edf3tTff7b72.Td2a8ffpackTb4b4b4(Tb4b4b4)
Te6edf3unpacked Tff7b72= Te6edf3TelemeterTff7b72.Td2a8fffrom_packedTb4b4b4(Te6edf3packedTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3unpackedTb4b4b4, Te6edf3TelemeterTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────